﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Utilitarios;
using SegIdenPC.Entidad;
using log4net;
using System.Globalization;
using System.Configuration;
using GS1.Utilitario;
using SegIdenPC.Herramientas;
using SegIdenPC.Helper;

namespace SegIdenPC.Formularios
{
    public partial class frmAvanceCorreo : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmAvanceCorreo));
        private String sFechaHoraActual = "";

        private DateTime dtFechaHora;

        private String TITULO = "Avance de Correo";
        #endregion

        #region --- Constructor ---
        public frmAvanceCorreo()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmAvanceCorreo_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            if (ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo.Equals(Constantes.CODIGO_ROL_ADMINISTRADOR))
            {

                //Cargar la fecha del día de hoy según sistema
                obtenerFechaHoraActual();

                dtFechaHora = DateTime.ParseExact(sFechaHoraActual, "dd/mm/yyyy hh:mm:ss", CultureInfo.InvariantCulture);

                //---------------------------------------------------------
                //Atención de separaciones
                //Obtiene lista de separaciones
                ListaPrestamo listaSeparaciones = listarPrestamos(new Prestamo { estado = Constantes.ESTADO_DOCUMENTO_PENDIENTE });
                //revisa la lista
                foreach (Prestamo separacion in listaSeparaciones.lista)
                {
                    //Pregunta si la fecha fin ya ha llegado
                    DateTime dtFechaFin = DateTime.ParseExact(separacion.fechaFin, "yyyy-mm-dd", CultureInfo.InvariantCulture);

                    if (dtFechaHora.CompareTo(dtFechaFin) > 0)
                    {

                        //Obtiene datos de los productos que estan separados
                        String ListaItem = "";

                        separacion.estado = Constantes.ESTADO_DOCUMENTO_RECEPCIONADO;

                        foreach (Item item in separacion.listaItem.lista)
                        {
                            Item itemLeido = obtenerItem(item);
                            ListaItem = ListaItem + " " + itemLeido.producto.codProductoProveedor + " - " +
                                        itemLeido.producto.nivelProducto.descripcion + " - " +
                                        itemLeido.producto.nivelTipo.descripcion + " - " +
                                        itemLeido.producto.nivelMaterial.descripcion + " - " +
                                        itemLeido.producto.nivelColor.descripcion + " / ";

                            //cambiar el estado de los items a Disponible
                            item.estado = Constantes.ESTADO_ITEM_DISPONIBLE;
                        }

                        //Actualizar prestamo
                        actualizarPrestamo(separacion);

                        //obtiene datos para el correo
                        CorreoModulo correoModuloConsulta = new CorreoModulo();
                        correoModuloConsulta.modulo = new Modulo();
                        correoModuloConsulta.modulo.codigo = Constantes.CODIGO_MODULO_MOVIL_PRESTAMOS;

                        ListaCorreoModulo listaCorreoModuloObtenido = listarCorreoModulo(correoModuloConsulta);

                        //Se preparan los correos para enviar dependiendo de los casos que se den
                        foreach (CorreoModulo correoModuloEnviar in listaCorreoModuloObtenido.lista)
                        {
                            String tituloCorreo = correoModuloEnviar.textoTitulo;
                            String CuerpoMensajeEnviado = "";

                            ListaUsuario listaCorreos = new ListaUsuario();

                            //Pregunta si hay que enviarlo al cliente y obtiene datos del cliente
                            if (correoModuloEnviar.indEnviarCliente.Equals(Constantes.SI))
                            {
                                Cliente cliente = clientePrestamo(separacion.cliente);
                                CuerpoMensajeEnviado = correoModuloEnviar.textoMensaje + " " + cliente.razonSocial;
                                //Consulta en la lista donde están los contactos
                                foreach (ContactoCliente contacto in cliente.listaContactoCliente.lista)
                                {
                                    //consulta si alguno ha autorizado a enviar un mail
                                    if (contacto.indenvioemail.Equals(Constantes.SI))
                                    {
                                        Usuario email = new Usuario();
                                        email.email = contacto.email;
                                        email.nombresyApellidos = contacto.nombresyApellidos;
                                        listaCorreos.add(email);
                                    }
                                }
                            }
                            //Pregunta si hay que enviarlo a la vendedora y obtiene datos de la vendedora
                            if (correoModuloEnviar.indEnviarUsuario.Equals(Constantes.SI))
                            {
                                Usuario usuarioPrestamo = obtenerUsuario(separacion.usuario);
                                listaCorreos.add(usuarioPrestamo);
                            }
                            //Pregunta si hay que enviarlo a la administración y obtiene datos de la administracion
                            if (correoModuloEnviar.indEnviarAdministrador.Equals(Constantes.SI))
                            {
                                Usuario usuarioConsulta = new Usuario();
                                usuarioConsulta.rol = new Rol();
                                //Rol de Administrador
                                usuarioConsulta.rol.codigo = "1";
                                ListaUsuario listaUsuarioCorreo = listaUsuarioObtenido(usuarioConsulta);

                                foreach (Usuario Administradores in listaUsuarioCorreo.lista)
                                {
                                    listaCorreos.add(Administradores);
                                }
                            }
                            //Pregunta si hay que enviarlo al correo del Usuario principal y obtiene sus datos
                            if (correoModuloEnviar.indEnviarUsuarioPrincipal.Equals(Constantes.SI))
                            {
                                //Usuario principal tiene código 3
                                Usuario email = obtenerUsuario(new Usuario() { codUsuario = "3" });
                                listaCorreos.add(email);
                            }

                            //Prepara email
                            CuerpoMensajeEnviado = CuerpoMensajeEnviado + correoModuloEnviar.textoMensajeAdicional + ListaItem;

                            // Ejecutar envio de mail de notificacion
                           // EmailHelper.enviarNotificacion(tituloCorreo, listaCorreos, CuerpoMensajeEnviado);
                        }

                    }
                }

                //Proceso de correo para prestamos que se llevaron
            } //Se cierra la validación del rol administrador
        }

        #region --- Metodos Correo ---

        private ListaUsuario listaUsuarioObtenido(Usuario usuario)
        {
            Operacion operacion = null;
             ListaUsuario listaUsuarioObtenido = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_USUARIOS;

            operacion.usuario = new Usuario();
            operacion.usuario = usuario;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return listaUsuarioObtenido;
            }

            // Obteniendo Objeto de Nivel
            listaUsuarioObtenido = contenidoXML.DeserializarTo<ListaUsuario>();

            return listaUsuarioObtenido;
        }

        private Usuario obtenerUsuario(Usuario usuario)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_USUARIO;

            operacion.usuario = new Usuario();
            operacion.usuario = usuario;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return usuario;
            }

            // Obteniendo Objeto de Nivel
            Usuario usuarioObtenido = contenidoXML.DeserializarTo<Usuario>();

            return usuarioObtenido;
        }

        private Cliente clientePrestamo(Cliente cliente)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_CLIENTE;

            operacion.cliente = new Cliente();
            operacion.cliente = cliente;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return cliente;
            }

            // Obteniendo Objeto de Nivel
            Cliente clienteObtenido = contenidoXML.DeserializarTo<Cliente>();

            return clienteObtenido;
        }

        private ListaCorreoModulo listarCorreoModulo(CorreoModulo correoModulo)
        {
            Operacion operacion = null;
            ListaCorreoModulo listaCorreoModuloObtenido = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_CORREO_MODULO;

            operacion.correoModulo = new CorreoModulo();
            operacion.correoModulo = correoModulo;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return listaCorreoModuloObtenido;
            }

            // Obteniendo Objeto de Nivel
            listaCorreoModuloObtenido = contenidoXML.DeserializarTo<ListaCorreoModulo>();

            return listaCorreoModuloObtenido;
        }

        private ListaPrestamo listarPrestamos(Prestamo prestamo)
        {
            Operacion operacion = null;
            ListaPrestamo listaPrestamoObtenido = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PRESTAMOS;

            operacion.prestamo = new Prestamo();
            operacion.prestamo = prestamo;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return listaPrestamoObtenido;
            }

            // Obteniendo Objeto de Nivel
            listaPrestamoObtenido = contenidoXML.DeserializarTo<ListaPrestamo>();

            return listaPrestamoObtenido;
        }

  /*      private ListaPrestamo listarPrestamos(Prestamo prestamo)
        {
            Operacion operacion = null;
            ListaPrestamo listaPrestamoObtenido = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PRESTAMOS;

            operacion.prestamo = new Prestamo();
            operacion.prestamo = prestamo;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return listaPrestamoObtenido;
            }

            // Obteniendo Objeto de Nivel
            listaPrestamoObtenido = contenidoXML.DeserializarTo<ListaPrestamo>();

            return listaPrestamoObtenido;
        }*/
        private Item obtenerItem(Item item)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_ITEM;
            operacion.item = item;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return item;
            }

            // Obteniendo Objeto de Producto
            Item itemObtenido = contenidoXML.DeserializarTo<Item>();

            return itemObtenido;

        }

        private void obtenerFechaHoraActual()
        {
            Operacion operacion = null;
            
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_HORA_ACTUAL;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                sFechaHoraActual = DateTime.Now.ToString();
                return;
            }

            // Obteniendo Objeto de Nivel
            Parametro parametro = contenidoXML.DeserializarTo<Parametro>();

            switch (parametro.codigo)
            {
                case Constantes.CODIGO_PARAMETRO_FECHAHORASISTEMA:
                    sFechaHoraActual = parametro.valor;
                    break;
                default:
                    sFechaHoraActual = DateTime.Now.ToString();
                    break;
            }
            return;
        }

        private void actualizarPrestamo(Prestamo prestamo)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_ACTUALIZAR_PRESTAMO;

                operacion.prestamo = prestamo;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    //this.txtCodigo.Text = operacionResultado.codigoGenerado;
                }
                else
                {
                    Libreria.ShowMessageboxError("No se guardo los datos", TITULO);
                    return;
                }


            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        #endregion
        #endregion
    }
}
